/**
 * 消息优先级枚举
 */
export enum MessagePriority {
    /** 低优先级 */
    LOW = 0,
    /** 普通优先级 */
    NORMAL = 1,
    /** 高优先级 */
    HIGH = 2
}

/**
 * 消息类型枚举
 * 定义游戏中所有可能的消息类型
 */
export enum MessageType {
    // === 游戏核心消息 ===
    /** 游戏开始 */
    GAME_START = 'game_start',
    /** 游戏结束 */
    GAME_END = 'game_end',
    /** 游戏暂停 */
    GAME_PAUSE = 'game_pause',
    /** 游戏恢复 */
    GAME_RESUME = 'game_resume',
    /** 游戏重置 */
    GAME_RESET = 'game_reset',
    /** 游戏渲染 */
    GAME_RENDER = 'game_render',
    
    // === 战斗相关消息 ===
    /** 战斗开始 */
    BATTLE_START = 'battle_start',
    /** 战斗结束 */
    BATTLE_END = 'battle_end',
    /** 回合开始 */
    TURN_START = 'turn_start',
    /** 回合结束 */
    TURN_END = 'turn_end',
    /** 攻击事件 */
    ATTACK_EVENT = 'attack_event',
    /** 伤害事件 */
    DAMAGE_EVENT = 'damage_event',
    /** 治疗事件 */
    HEAL_EVENT = 'heal_event',
    /** 死亡事件 */
    DEATH_EVENT = 'death_event',
    
    // === 单位相关消息 ===
    /** 单位创建 */
    UNIT_CREATED = 'unit_created',
    /** 单位销毁 */
    UNIT_DESTROYED = 'unit_destroyed',
    /** 单位移动 */
    UNIT_MOVED = 'unit_moved',
    /** 单位选中 */
    UNIT_SELECTED = 'unit_selected',
    /** 单位取消选中 */
    UNIT_DESELECTED = 'unit_deselected',
    /** 血量变化 */
    HEALTH_CHANGED = 'health_changed',
    /** 等级提升 */
    LEVEL_UP = 'level_up',
    /** 经验值获得 */
    EXP_GAINED = 'exp_gained',
    
    // === UI相关消息 ===
    /** UI显示 */
    UI_SHOW = 'ui_show',
    /** UI隐藏 */
    UI_HIDE = 'ui_hide',
    /** UI更新 */
    UI_UPDATE = 'ui_update',
    /** 按钮点击 */
    BUTTON_CLICKED = 'button_clicked',
    /** 面板打开 */
    PANEL_OPENED = 'panel_opened',
    /** 面板关闭 */
    PANEL_CLOSED = 'panel_closed',
    /** 高亮实体统计项 */
    HIGHLIGHT_ENTITY_STATS_ITEM = 'highlight_entity_stats_item',
    
    // === 动画相关消息 ===
    /** 动画开始 */
    ANIMATION_START = 'animation_start',
    /** 动画结束 */
    ANIMATION_END = 'animation_end',
    /** 特效播放 */
    EFFECT_PLAY = 'effect_play',
    /** 特效结束 */
    EFFECT_END = 'effect_end',
    
    // === 系统相关消息 ===
    /** 系统错误 */
    SYSTEM_ERROR = 'system_error',
    /** 系统警告 */
    SYSTEM_WARNING = 'system_warning',
    /** 系统信息 */
    SYSTEM_INFO = 'system_info',
    /** 资源加载完成 */
    RESOURCE_LOADED = 'resource_loaded',
    /** 资源加载失败 */
    RESOURCE_LOAD_FAILED = 'resource_load_failed',
    
    // === 自定义消息 ===
    /** 自定义消息1 */
    CUSTOM_1 = 'custom_1',
    /** 自定义消息2 */
    CUSTOM_2 = 'custom_2',
    /** 自定义消息3 */
    CUSTOM_3 = 'custom_3'
}

/**
 * 消息接口
 * 定义消息的基本结构
 */
export interface IMessage<T = any> {
    /** 消息唯一ID */
    id: string;
    
    /** 消息类型 */
    type: MessageType;
    
    /** 消息数据 */
    data?: T;
    
    /** 消息优先级 */
    priority: MessagePriority;
    
    /** 消息时间戳 */
    timestamp: number;
    
    /** 消息发送者 */
    sender?: string;
    
    /** 消息接收者（可选，用于点对点消息） */
    receiver?: string;
    
    /** 消息标签（可选，用于分类和过滤） */
    tags?: string[];
    
    /** 消息过期时间（可选，毫秒时间戳） */
    expireTime?: number;
    
    /** 是否需要确认收到（可选） */
    requireAck?: boolean;
}

/**
 * 消息订阅者接口
 */
export interface IMessageSubscriber {
    /** 回调函数 */
    callback: (message: IMessage<any>) => void;
    
    /** 目标对象（可选，用于批量取消订阅） */
    target?: any;
    
    /** 订阅时间 */
    subscribeTime: number;
    
    /** 订阅标签（可选，用于过滤） */
    tags?: string[];
    
    /** 是否只执行一次（可选） */
    once?: boolean;
}

/**
 * 战斗事件数据接口
 */
export interface IBattleEventData {
    /** 攻击者ID */
    attackerId?: string;
    
    /** 目标ID */
    targetId?: string;
    
    /** 伤害值 */
    damage?: number;
    
    /** 治疗值 */
    healValue?: number;
    
    /** 是否暴击 */
    isCritical?: boolean;
    
    /** 是否闪避 */
    isDodge?: boolean;
    
    /** 是否格挡 */
    isBlock?: boolean;
    
    /** 技能ID */
    skillId?: string;
    
    /** 位置信息 */
    position?: { x: number; y: number };
}

/**
 * 单位事件数据接口
 */
export interface IUnitEventData {
    /** 单位ID */
    unitId: string;
    
    /** 单位类型 */
    unitType?: string;
    
    /** 当前血量 */
    currentHealth?: number;
    
    /** 最大血量 */
    maxHealth?: number;
    
    /** 当前等级 */
    level?: number;
    
    /** 当前经验值 */
    experience?: number;
    
    /** 位置信息 */
    position?: { x: number; y: number };
    
    /** 额外数据 */
    extraData?: any;
}

/**
 * UI事件数据接口
 */
export interface IUIEventData {
    /** UI元素ID */
    elementId?: string;
    
    /** UI类型 */
    uiType?: string;
    
    /** 显示状态 */
    visible?: boolean;
    
    /** 位置信息 */
    position?: { x: number; y: number };
    
    /** 大小信息 */
    size?: { width: number; height: number };
    
    /** 额外参数 */
    params?: any;
}

/**
 * 音频事件数据接口
 */
export interface IAudioEventData {
    /** 音频资源路径 */
    audioPath: string;
    
    /** 音量 (0-1) */
    volume?: number;
    
    /** 是否循环 */
    loop?: boolean;
    
    /** 音频类型 */
    audioType?: 'sound' | 'bgm';
    
    /** 淡入时间（秒） */
    fadeInTime?: number;
    
    /** 淡出时间（秒） */
    fadeOutTime?: number;
}

/**
 * 网络事件数据接口
 */
export interface INetworkEventData {
    /** 连接状态 */
    connected?: boolean;
    
    /** 数据内容 */
    data?: any;
    
    /** 数据类型 */
    dataType?: string;
    
    /** 错误信息 */
    error?: string;
    
    /** 服务器地址 */
    serverUrl?: string;
    
    /** 延迟（毫秒） */
    latency?: number;
}

/**
 * 系统事件数据接口
 */
export interface ISystemEventData {
    /** 错误代码 */
    errorCode?: string;
    
    /** 错误信息 */
    message?: string;
    
    /** 错误详情 */
    details?: any;
    
    /** 资源路径 */
    resourcePath?: string;
    
    /** 加载进度 (0-1) */
    progress?: number;
    
    /** 系统状态 */
    systemStatus?: string;
}

/**
 * 消息过滤器接口
 */
export interface IMessageFilter {
    /** 消息类型过滤 */
    types?: MessageType[];
    
    /** 优先级过滤 */
    priorities?: MessagePriority[];
    
    /** 发送者过滤 */
    senders?: string[];
    
    /** 标签过滤 */
    tags?: string[];
    
    /** 时间范围过滤 */
    timeRange?: {
        start: number;
        end: number;
    };
    
    /** 自定义过滤函数 */
    customFilter?: (message: IMessage) => boolean;
}

/**
 * 消息处理结果接口
 */
export interface IMessageProcessResult {
    /** 是否处理成功 */
    success: boolean;
    
    /** 处理时间（毫秒） */
    processTime: number;
    
    /** 错误信息 */
    error?: string;
    
    /** 处理的消息数量 */
    processedCount: number;
    
    /** 跳过的消息数量 */
    skippedCount: number;
}